package com.qf;

import com.qf.config.SpringConfig;
import com.qf.dao.UserDao;
import com.qf.dao.impl.UserDaoImpl1;
import com.qf.dao.impl.UserDaoImpl2;
import com.qf.service.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author lwc
 * @date 2021/10/26 20:33
 * @Description ：
 * 使用注解的步骤
 *  1.添加依赖
 *      spring-aop
 *  2.在配置文件中 开启组件扫描
 *  3.创建类 在类上添加创建对象注解
 *
 * @component
 * @Service
 * @Controller
 * @Repository
 *
 *  4.手动指定创建bean的这些注解的value值，这个值定义成跟别人的类中注入的
 *  属性值一致 比如service 主图一个userDao，那么建议到的bean名字就为userDao，这样做的好处 无论是
 * @Autowired 还是@Resource 都可以根据名字注入
 *
 */
public class App {

    @Test
    public void test1(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:beans1.xml");

        UserService userService = applicationContext.getBean("userService", UserService.class);

        UserDao userDao = applicationContext.getBean("userDaoImpl1", UserDao.class);

        System.out.println(userDao);
        userService.save();

    }
    //纯利用注解 不使用xml
    @Test
    public void test2(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);

        UserService userServiceImpl = applicationContext.getBean("userService", UserService.class);
        UserDao userDaoImpl1 = applicationContext.getBean("userDaoImpl1", UserDao.class);
        UserDao userDaoImpl2 = applicationContext.getBean("userDaoImpl2", UserDao.class);

        userServiceImpl.save();
        /*
        运行结果
        先调用了userService 由于userDaoImpl1的优先级比2的高所以先输出1
         userDaoImpl1的无参数构造方法
         userDaoImpl2的无参数构造

         userService中注入的userDao:com.qf.dao.impl.UserDaoImpl1@6ef888f6
          User(id=1, name=妲己)
         */
        // userService的添加方法
        //  调用了userDaoImpl1这个bean的save方法

    }
}
